package com.ruoyi.basebill.service.impl.billIssue;

import com.ruoyi.basebill.domain.*;
import com.ruoyi.basebill.mapper.TWfzRemunerationMapper;
import com.ruoyi.basebill.service.billIssue.ISbjtService;
import com.ruoyi.basebill.service.impl.WfzSbjtServiceImpl;
import com.ruoyi.basebill.service.impl.billIssue.util.BillIssueUtil;
import com.ruoyi.basebill.service.impl.billIssue.util.Jsfs;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

@Service
public class SbjtService implements ISbjtService {

    @Autowired
    private TWfzRemunerationMapper tWfzRemunerationMapper;

    @Autowired
    private BillIssueUtil billIssueUtil;

    @Autowired
    private WfzSbjtServiceImpl wfzSbjtService;


    @Override
    public int billIssue(Long billId) {
        WfzSbjt wfzSbjt = new WfzSbjt();
        //首先根据传入的单据id，查找对应的数据
        TWfzRemuneration tWfzRemuneration = tWfzRemunerationMapper.selectTWfzRemunerationByFid(billId);
        //获取薪酬总表的单据头信息
        String fcompany = tWfzRemuneration.getFcompany();//组织
        String fperiod = tWfzRemuneration.getFperiod();//薪酬期间

        //获取当前登录的用户
        LoginUser loginUser = SecurityUtils.getLoginUser();
        String username = loginUser.getUsername();

        //总人数就是薪酬总表里所有的人  合并纳税成本中心就是属性是同组织下合并纳税成本中心的人数 关联方就是非同组织和同组织下二级组织属性的
        //总人数
        BigDecimal zrs = BigDecimal.valueOf(tWfzRemuneration.getTWfzRemunerationentryList().size());
        //合并纳税成本中心人数
        int nscbzxrs = 0;
        //关联方人数
        int glf = 0;

        // 准备一个map，用来存储不同成本中心所对应的分录数据
        HashMap<String, List<TWfzRemunerationentry>> map1 = new HashMap<>();
        //开始遍历薪酬总表的分录信息
        List<TWfzRemunerationentry> tWfzRemunerationentryList = tWfzRemuneration.getTWfzRemunerationentryList();
        for (TWfzRemunerationentry tWfzRemunerationentry : tWfzRemunerationentryList) {
            String fcostnumber = tWfzRemunerationentry.getFcostnumber();
            if (map1.containsKey(fcostnumber)){
                map1.get(fcostnumber).add(tWfzRemunerationentry);
            }else {
                ArrayList<TWfzRemunerationentry> objects = new ArrayList<>();
                objects.add(tWfzRemunerationentry);
                map1.put(fcostnumber,objects);
            }
        }
        //循环结束，对应的数据，根据成本中心进行划分。
        ArrayList<WfzSbjtentry> wfzSbjtentries = new ArrayList<>();

        for (String s : map1.keySet()) {
            //准备一个map，用来存储不同离职状态的数据。
            HashMap<Long, List<TWfzRemunerationentry>> map2 = new HashMap<>();
            List<TWfzRemunerationentry> tWfzRemunerationentries = map1.get(s);
            for (TWfzRemunerationentry tWfzRemunerationentry : tWfzRemunerationentries) {
                Long fislz = tWfzRemunerationentry.getFislz();
                if (map2.containsKey(fislz)){
                    map2.get(fislz).add(tWfzRemunerationentry);
                }else {
                    ArrayList<TWfzRemunerationentry> objects = new ArrayList<>();
                    objects.add(tWfzRemunerationentry);
                    map2.put(fislz,objects);
                }
            }
            //循环结束，离职状态也进行划分
            //获取公用的数据
            TWfzRemunerationentry tWfzRemunerationentry1 = map1.get(s).get(0);
            String gynumber = tWfzRemunerationentry1.getFcostnumber();
            String fcostnumber = billIssueUtil.costNumber(gynumber);//成本中心编码
            String fcostname = tWfzRemunerationentry1.getFcostname();//成本中心名称
            /*成本中心所属财务组织字段数据获取方式待定*/
            String fcostcompany = tWfzRemunerationentry1.getFcostcompany();//成本中心所属财务组织
            String jsfs = billIssueUtil.Jsfs(Jsfs.SB,fcompany, tWfzRemunerationentry1.getFpersonnumber());//组织间结算方式
            String costType = billIssueUtil.costType(gynumber);//成本中心属性
            Long isdysb = billIssueUtil.getIsdysb(gynumber);//是否当月缴纳
            String fvourtype = tWfzRemunerationentry1.getFvourtype();//凭证字

            if ("同组织下合并纳税成本中心".equals(jsfs)){
                nscbzxrs += map1.get(s).size();
            }
            if ("同组织下是二级组织".equals(jsfs) || "非同组织".equals(jsfs)){
                glf += map1.get(s).size();
            }

            //开始循环区分好的薪酬总表-工资发放分录
            for (Long aLong : map2.keySet()) {
                WfzSbjtentry wfzSbjtentry = new WfzSbjtentry();
                //对其中需要进行计算的属性进行初始化
                wfzSbjtentry.setFylbx(new BigDecimal(0));
                wfzSbjtentry.setFyybx(new BigDecimal(0));
                wfzSbjtentry.setFsybx(new BigDecimal(0));
                wfzSbjtentry.setFssbx(new BigDecimal(0));
                wfzSbjtentry.setFgsbx(new BigDecimal(0));
                wfzSbjtentry.setFgryl(new BigDecimal(0));
                wfzSbjtentry.setFgryy(new BigDecimal(0));
                wfzSbjtentry.setFgrsy(new BigDecimal(0));

                for (TWfzRemunerationentry tWfzRemunerationentry : map2.get(aLong)) {
                    wfzSbjtentry.setFylbx(wfzSbjtentry.getFylbx().add(tWfzRemunerationentry.getFylbx()));//养老保险
                    wfzSbjtentry.setFyybx(wfzSbjtentry.getFyybx().add(tWfzRemunerationentry.getFyybx()));//医疗保险
                    wfzSbjtentry.setFsybx(wfzSbjtentry.getFsybx().add(tWfzRemunerationentry.getFsyubx()));//生育保险
                    wfzSbjtentry.setFssbx(wfzSbjtentry.getFssbx().add(tWfzRemunerationentry.getFsybx()));//失业保险
                    wfzSbjtentry.setFgsbx(wfzSbjtentry.getFgsbx().add(tWfzRemunerationentry.getFgsbx()));//工伤保险
                    wfzSbjtentry.setFgryl(wfzSbjtentry.getFgryl().add(tWfzRemunerationentry.getFgryl()));//个人养老
                    wfzSbjtentry.setFgryy(wfzSbjtentry.getFgryy().add(tWfzRemunerationentry.getFgryy()));//个人医疗
                    wfzSbjtentry.setFgrsy(wfzSbjtentry.getFgrsy().add(tWfzRemunerationentry.getFgrsy()));//个人失业
                }
                //对数据进行赋值
                wfzSbjtentry.setFcostnumber(fcostnumber);//成本中心编码
                wfzSbjtentry.setFcostname(fcostname);//成本中心名称
                wfzSbjtentry.setFcostcompany(fcostcompany);//成本中心所属财务组织
                wfzSbjtentry.setFjsfs(jsfs);//组织间结算方式
                wfzSbjtentry.setFcbzxxz(costType);//成本中心属性
                wfzSbjtentry.setFisdy(isdysb);//是否当月缴纳
                wfzSbjtentry.setFvourtype(fvourtype);//凭证字
                Long fislz = map2.get(aLong).get(0).getFislz();
                wfzSbjtentry.setFislz(fislz);//是否离职员工

                //各项差额数据暂时不做处理

                //将处理好的社保缴纳分录数据加入到分录中
                wfzSbjtentries.add(wfzSbjtentry);

            }


        }

        //开始获取单据头信息
        billIssueUtil.setBillNumber(wfzSbjt);//设置单据编号
        String company = billIssueUtil.costNumber(fcompany);
        wfzSbjt.setFcompany(company);//组织
        wfzSbjt.setFperiod(fperiod);//薪酬期间
        wfzSbjt.setFzrs(zrs);//总人数
        wfzSbjt.setFnscbzxrs(BigDecimal.valueOf(nscbzxrs));//合并纳税成本中心人数
        wfzSbjt.setFglf(BigDecimal.valueOf(glf));//关联方人数
        String vourtype = billIssueUtil.getPzz(fcompany);
        wfzSbjt.setFvourtype(vourtype);//凭证字
        wfzSbjt.setFcreator(username);//制单人
        wfzSbjt.setFcreatetime(new Date());//制单时间
        wfzSbjt.setFlastupdateuser(username);//最后修改人
        wfzSbjt.setFlastupdatetime(new Date());//最后修改时间
        wfzSbjt.setFstate("SAVE");//单据状态
        wfzSbjt.setFsourcebillid(billId);//来源单ID
        wfzSbjt.setFiseas(0l);//是否同步至eas
        wfzSbjt.setWfzSbjtentryList(wfzSbjtentries);//设置社保集体分录数据


//        //开始遍历薪酬总表的分录信息
//        List<TWfzRemunerationentry> tWfzRemunerationentryList = tWfzRemuneration.getTWfzRemunerationentryList();
//        if (tWfzRemunerationentryList != null && tWfzRemunerationentryList.size() >0){
//            for (int i = 0; i < tWfzRemunerationentryList.size(); i++) {
//                TWfzRemunerationentry tWfzRemunerationentry = tWfzRemunerationentryList.get(i);
//                String fcostnumber = tWfzRemunerationentry.getFcostnumber();//成本中心
//                String fcostname = tWfzRemunerationentry.getFcostname();//成本中心名称
//                String fcostcompany = tWfzRemunerationentry.getFcostcompany();//成本中心所属财务组织
//                BigDecimal fylbx = tWfzRemunerationentry.getFylbx();//养老保险
//                BigDecimal fyybx = tWfzRemunerationentry.getFyybx();//医疗保险
//                BigDecimal fsybx = tWfzRemunerationentry.getFsybx();//失业保险
//                BigDecimal fgsbx = tWfzRemunerationentry.getFgsbx();//工伤保险
//                BigDecimal fgryl = tWfzRemunerationentry.getFgryl();//个人养老
//                BigDecimal fgryy = tWfzRemunerationentry.getFgryy();//个人医疗
//                BigDecimal fgrsy = tWfzRemunerationentry.getFgrsy();//个人失业
//
//                String fvourtype = tWfzRemunerationentry.getFvourtype();//凭证字
//                Long fissbdy = tWfzRemunerationentry.getFissbdy();//是否当月发放
//                Long fislz = tWfzRemunerationentry.getFislz();//是否离职
//
//                WfzSbjtentry wfzSbjtentry = new WfzSbjtentry();
//                wfzSbjtentry.setFcostnumber(billIssueUtil.costNumber(fcostnumber));//成本中心
//                wfzSbjtentry.setFcostname(fcostname);//成本中心名称
//                wfzSbjtentry.setFcostcompany(billIssueUtil.costNumber(fcostcompany));//成本中心所属财务组织
//                wfzSbjtentry.setFylbx(fylbx);//养老保险
//                wfzSbjtentry.setFyybx(fyybx);//医疗保险
//                //缺少数据，生育保险
//                wfzSbjtentry.setFssbx(fsybx);//失业保险
//                wfzSbjtentry.setFgsbx(fgsbx);//工伤保险
//                wfzSbjtentry.setFgryl(fgryl);//个人养老
//                wfzSbjtentry.setFgryy(fgryy);//个人医疗
//                wfzSbjtentry.setFgrsy(fgrsy);//个人失业
//                //缺少数据，养老保险差额
//                //缺少数据，医疗保险差额
//                //缺少数据，生育保险差额
//                //缺少数据，失业保险差额
//                //缺少数据，工伤保险差额
//
//                //组织间结算方式：
//                //先判断成本中心是否和单据组织的所属一级组织相同
//                //如果相同则进入下一步判断
//                //如果不同则是  “非同组织”
//                //判断成本中心是否与单据的所属二级组织相同
//                //如果不同则是  “同组织下是二级组织”
//                //如果相同则是  “同组织下成本中心”
//
//                //获取分录的结算方式
//                String jsfs = billIssueUtil.Jsfs(fcompany, fcostnumber);
//                wfzSbjtentry.setFjsfs(jsfs);//组织间结算方式
//
//                //成本中心属性：
//                String costType = billIssueUtil.costType(fcostnumber);
//                wfzSbjtentry.setFcbzxxz(costType);//成本中心属性
//
//
//                wfzSbjtentry.setFisdy(0l);//是否当月发放
//                wfzSbjtentry.setFislz(fislz);//是否离职
//                wfzSbjtentry.setFvourtype(fvourtype);//凭证字
//
//                sbjtEntryInfos.add(wfzSbjtentry);//新增到单据分录
//            }
//        }
//
//        //总人数就是薪酬总表里所有的人  合并纳税成本中心就是属性是同组织下合并纳税成本中心的人数 关联方就是非同组织和同组织下二级组织属性的
//        //总人数
//        BigDecimal zrs = BigDecimal.valueOf(sbjtEntryInfos.size());
//        //合并纳税成本中心人数
//        int nscbzxrs = 0;
//        //关联方人数
//        int glf = 0;
//        for (int i = 0; i < sbjtEntryInfos.size(); i++) {
//            WfzSbjtentry wfzSbjtentry = sbjtEntryInfos.get(i);
//            String fjsfs = wfzSbjtentry.getFjsfs();
//            if ("同组织下合并纳税成本中心".equals(fjsfs)){
//                nscbzxrs++;
//            }
//            if ("同组织下是二级组织".equals(fjsfs) || "非同组织".equals(fjsfs)){
//                glf++;
//            }
//        }
//
//        //开始赋值
//
//        billIssueUtil.setBillNumber(wfzSbjt);
//        wfzSbjt.setFcompany(billIssueUtil.costNumber(fcompany));//组织
//        wfzSbjt.setFperiod(fperiod);//薪酬期间
//        wfzSbjt.setFzrs(zrs);//总人数
//        wfzSbjt.setFnscbzxrs(BigDecimal.valueOf(nscbzxrs));//合并纳税成本中心人数
//        wfzSbjt.setFglf(BigDecimal.valueOf(glf));//关联方人数
//        wfzSbjt.setFcreator(username);//创建者
//        wfzSbjt.setFlastupdateuser(username);//最后修改者
//        wfzSbjt.setFstate("SAVE");//状态
//        wfzSbjt.setFsourcebillid(billId);//来源单ID
//        wfzSbjt.setFiseas(0L);//是否同步至eas
//
//        wfzSbjt.setWfzSbjtentryList(sbjtEntryInfos);//设置单据分录

        int i = wfzSbjtService.insertWfzSbjt(wfzSbjt);
        return i;
    }

    @Override
    public int pushSbft(ArrayList<WfzSbjr> wfzSbjrs) {
        return 0;
    }


}
